`ifndef INSTF_ID_V
`define INSTF_ID_V


`include "defines.v"

module instf_id(
	input  wire 						clk,
	input  wire 						rstn,
	input  wire 						hold_flag_i,

	// from instf
	input  wire[`InstAddrWidth - 1 : 0] inst_addr_i,
	input  wire[`InstWidth - 1 : 0]  	inst_i, 
	
	// to id
	output wire[`InstAddrWidth - 1 : 0] inst_addr_o, 
	output wire[`InstWidth - 1 : 0]  	inst_o
);

reg rom_flag;

always @(posedge clk or negedge rstn) begin
    if(rstn == 1'b0) begin
        rom_flag <= 1'b0;
    end
    else if(hold_flag_i == 1'b1) begin
        rom_flag <= 1'b0;
    end
    else begin
        rom_flag <= 1'b1;
    end
end

assign inst_o = rom_flag ? inst_i : `INST_NOP;

// 指令地址传递
pipe_dff #(32) inst_addr_dff(
    .clk        (clk)           	,		
    .rstn	    (rstn)          	,
    .hold_flag_i(hold_flag_i)  		,
    .def_data   (`INST_ZERO_ADDR) 	,
    .data_i     (inst_addr_i)   	,
    .data_o	    (inst_addr_o)
);

// 指令传递
// 该拍由rom完成
// pipe_dff #(32) inst_dff(
//     .clk        (clk)       		,		
//     .rstn	    (rstn)      		,
//     .hold_flag_i(hold_flag_i)      	,
//     .def_data   (`INST_NOP) 		,
//     .data_i     (inst_i)    		,
//     .data_o	    (inst_o)
// );

endmodule


`endif // INSTF_ID_V